首先我們先定義一個返回正確url的func
// 定義一個func叫LegitimateURL,並給定參數是原本的URL,並返回url的物件
func LegitimateURL(requestURL: String) -> URL {
let legitimateURL = requestURL.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)
// 創建一個url,並強制解包legitimateURL,代表legitimateURL不能為空值
let url = URL.init(string: legitimateURL!)
return url!
}
addingPercentEncoding(withAllowedCharacters:):
這個方法用來處理 URL 中的特殊字符(例如空格、符號等),確保它們以正確的格式出現在 URL 中。
urlQueryAllowed:
定義了在 URL 查詢中允許的符號。使用這個符號集可以確保請求 URL 中的所有符號都能被正確編碼。
func callAPI() {
// 這邊強制解包剛剛選取的selectedArea
//
let city = "\(selectedArea!)"
let requestURL = LegitimateURL(requestURL: "這邊是你的requestURL,因會員授權碼關係,所以這邊不公開給大家,大家可以去上方網址找尋自己的喔" + city)
這邊一樣是在callAPI的func裡面喔!
// 這邊是用URLSession.shared.dataTask發送請求,這是一個異步處理喔,這邊的self是防止閉包的循環引用的問題
URLSession.shared.dataTask(with: requestURL) { [self]
(data, response, error) in
// 錯誤處理,如請求失敗則返回錯誤訊息
if let error = error {
print(error.localizedDescription)
}
// 將response轉換為HTTPURLResponse,並 print 出HTTPURLResponse
if let response = response {
print("====================")
print(response as! HTTPURLResponse)
print("====================")
}
if let data = data {
let decoder = JSONDecoder()
do {
self.weatherData2 = try decoder.decode(weatherData.self, from: data)
print("====================")
print(weatherData2 ?? "")
print("====================")
//主線成
DispatchQueue.main.async {
self.TView.reloadData()
}
} catch {
print(error.localizedDescription)
}
}
}.resume()
這邊的程式是先看是否有資料傳送進來,並用JSONDecoder解析成weatherdata類型的實例,如果解析成功就儲存在weatherData2,並print出來。
而主線成就是用來更新tableview的資料
.resume()啟動請求
這段程式碼的主要作用是發送一個 GET 請求到特定的 API,獲取天氣數據,解析這些數據,然後在主線程上更新tableview。如果出現任何錯誤,會打印出錯誤信息。這是一個最簡單也是最普通的請求方式,明天繼續會跟大家分享天氣api的專案喔!